
/**********************************************************************************\
** 文件名称: menu.c
** 创建人员: YCG
** 创建日期: 2018-11-22
** 文档描述: 本文键只是大致将各功能区分开来，各函数之间是紧密联系的。
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include	"menu.h"

time_struct  sec, min, hour, week, day, month, year; //秒、分、时、星期、日、月、年
bit led_point = 0;          //外围整点标记
bit sec_update_flag = 0;    //秒更新标记
bit show_update_flag = 0;   //秒更新标记
u8 showState = 0;

/*******************************************************************************
** 函数名称: MainInit
** 功能描述:
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-22
********************************************************************************/
void MainInit(void) {
    delay(500);
    if(KeyRead(KEY_MENU, KEY_SHORT)) {}    //清除所有的键值，防止误触发
    if(KeyRead(KEY_MENU, KEY_LONG))  {}
    if(KeyRead(KEY_ADD, KEY_SHORT))  {}
    if(KeyRead(KEY_ADD, KEY_LONG))   {}
}

/*******************************************************************************
** 函数名称: MainUpdate
** 功能描述: 从DS1302更新系统的时间显示，每秒更新一次
							只有菜单值为零时才更新
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-22
********************************************************************************/
void MainUpdate(void) {
    if(GetSystime() > 999) {       //只有定时器计时达到990ms以上是才读取秒数有没有改变,避免一直读秒
        if(sec.V != DsReadReg(SEC)) { //判断秒数有没有更新
					  ResetSystime();            //清零计时
					
            DsReadTime(SEC, &sec);      //更新秒
            DsReadTime(MIN, &min);      //更新分
            DsReadTime(HOUR, &hour);    //更新时
            DsReadTime(WEEK, &week);    //更新星期
            DsReadTime(DAY, &day);      //更新日
            DsReadTime(MONTH, &month);  //更新月
            DsReadTime(YEAR, &year);    //更新年
					
            sec_update_flag  = 1;       //设置1s更新标记
            show_update_flag = 1;       //更新数码管显示数据
					  }
    }
}

/*******************************************************************************
** 函数名称: MainShow
** 功能描述: 将数据显示到数码管，只有更新标记出现时才会更新
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-22
********************************************************************************/
void MainShow(void) {
    if(show_update_flag) {
        switch(showState) {      //判断目前时什么显示态
        case SHOWTIME :        //显示时间模式
            SetCube(sec.L,  0);           //设置数码管显示
            SetCube(sec.H,  1);
            SetCube(10,  2);              //显示-
            SetCube(min.L,  3);
            SetCube(min.H,  4);
            SetCube(10,  5);              //显示-
            SetCube(hour.L, 6);
            SetCube(hour.H, 7);
            break;
        case SHOWDATE :        //显示时间模式
            SetCube(week.L,  0);           //设置数码管显示
            SetCube(week.H,  1);
            SetCube(10,  2);              //显示-
            SetCube(day.L,  3);
            SetCube(day.H,  4);
            SetCube(10,  5);              //显示-
            SetCube(month.L, 6);
            SetCube(month.H, 7);
            break;
        }
        show_update_flag = 0;        //将标记清零
    }
}

/*******************************************************************************
** 函数名称: MainMune
** 功能描述: 菜单值管理，一共有五个菜单，每次菜单键按下都会更新值，并刷新数码管显示模式
** 参数说明: mode_num: [输入/出]  系统的菜单值，
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-22
********************************************************************************/
void MainKeyMenu(u8* menu) {
    if(KeyRead(KEY_MENU, KEY_LONG))  //读取菜单键短按
    {
        if(*menu == 0) { //菜单值为零时

        }
    }
    /**********菜单键的扫描以及执行对应的程序**********/
    if(KeyRead(KEY_MENU, KEY_SHORT))  //读取菜单键短按
    {
        if(++*menu >= MENU_MAX)  *menu = 0; //菜单只有个数

        /**********菜单键按下后执行一次的程序**********/
        switch(*menu) {            //用来处理菜单对应功能
        case MENU_SHOW :           //正常显示模式
            break;
        case MENU_SET_MIN_L :      //设置分钟个位模式
					   SetCubeBlink(3);
            break;
        case MENU_SET_MIN_H :      //设置分钟十位模式
					   SetCubeBlink(4);
            break;
        case MENU_SET_HOUR_L :     //设置小时个位模式
					   SetCubeBlink(6);
            break;
        case MENU_SET_HOUR_H :     //设置小时十位模式
					   SetCubeBlink(7);
            break;
        case MENU_SET_WEEK :       //设置星期模式
					   SetCubeBlink(0);
            break;
        case MENU_SET_DAY_L :      //设置日个位模式
					   SetCubeBlink(3);
            break;
        case MENU_SET_DAY_H :      //设置日十位模式
					   SetCubeBlink(4);
            break;
        case MENU_SET_MONTH_L :    //设置月份个位模式
					   SetCubeBlink(6);
            break;
        case MENU_SET_MONTH_H :    //设置月份十位模式
					   SetCubeBlink(7);
            break;
//        case MENU_SET_YEAR_L :     //设置年个位模式
//					   SetCubeBlink[6];
//            break;
//        case MENU_SET_YEAR_H :     //设置年十位模式
//					   SetCubeBlink[7];
//            break;
        }
    }

}
/*******************************************************************************
** 函数名称: MainKeyAdd
** 功能描述: 每级菜单下增加键对应的功能
							 短按：
										 模式0：切换显示模式
										 模式1-4：增加所对应的时间，并且刷新显示
							 长按：
										 打开关闭整点显示
** 参数说明: mode: [输入/出]  Led显示模式的设置
**			     menu: [输入]     输入当前的菜单值
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-22
********************************************************************************/
void MainKeyAdd(u8 * mode, u8 menu) {

    if(KeyRead(KEY_ADD, KEY_LONG))   //读取增加键长按
    {
        led_point = ~led_point;       //打开关闭整点显示
    }

    if(KeyRead(KEY_ADD, KEY_SHORT))   //读取 增加键 短按
    {
        switch(menu) {            //用来处理菜单对应功能
        case MENU_SHOW :           //正常显示模式
                 if(++*mode > LED_MODE_MAX - 1)  *mode = 0; 
            break;
        case MENU_SET_MIN_L :      //设置分钟个位模式
            AddLimitRang(&min.L, min.H, 0, 9, 9);
            DsSetTime(MIN, min);
            break;
        case MENU_SET_MIN_H :      //设置分钟十位模式
            AddLimitRang(&min.H, min.L, 0, 5, 5);
            DsSetTime(MIN, min);
            break;
        case MENU_SET_HOUR_L :     //设置小时个位模式
            AddLimitRang(&hour.L, hour.H, 1, 9, 3);
            DsSetTime(HOUR, hour);
            break;
        case MENU_SET_HOUR_H :     //设置小时十位模式
            AddLimitRang(&hour.H, hour.L, 3, 2, 1);
            DsSetTime(HOUR, hour);
            break;
        case MENU_SET_WEEK :       //设置星期模式
            AddLimitRang(&week.L, week.H, 0, 7, 7);
            DsSetTime(WEEK, week);
            break;
        case MENU_SET_DAY_L :      //设置日个位模式
            AddLimitRang(&day.L, day.H, 2, 9, 1);
            DsSetTime(DAY, day);
            break;
        case MENU_SET_DAY_H :      //设置日十位模式
            AddLimitRang(&day.H, day.L, 1, 3, 2);
            DsSetTime(DAY, day);
            break;
        case MENU_SET_MONTH_L :    //设置月份个位模式
            AddLimitRang(&month.L, month.H, 0, 9, 2);
            DsSetTime(MONTH, month);
            break;
        case MENU_SET_MONTH_H :    //设置月份十位模式
            AddLimitRang(&month.H, month.L, 2, 1, 0);
            DsSetTime(MONTH, month);
            break;
//        case MENU_SET_YEAR_L :     //设置年个位模式
//            AddLimitRang(&year.L, year.H, 0, 9, 9);
//            DsSetTime(YEAR, year);
//            break;
//        case MENU_SET_YEAR_H :     //设置年十位模式
//            AddLimitRang(&year.H, year.L, 0, 9, 9);
//            DsSetTime(YEAR, year);
            break;
        }
        show_update_flag = 1; //增加键按下一定会更新显示
    }
}
void MainMode(u8 mode) {
    switch(mode) {
			    case 0 :        

        
        break;
		}

}
/********************************End of File************************************/
